package com.study.jvm.classloader;

//[总结一个某东的面试题 \-\-\- java类的初始化时机 \- idgq \- SegmentFault 思否](https://segmentfault.com/a/1190000005916150)
public class InitTest {
    public static void main(String[] args) {
        /**
         *
         */
        A a = new B();
//        System.out.println("-------------------------------------");

//        /**
//         *
//         */
//        /**
//         * 这里只会输出“SuperClass init”, 而不会输出“SubClass init”.
//         * 对于静态字段，只有直接定义这个字段的类才会被初始化
//         * 因此通过子类引用父类中定义的静态字段，只会触发父类的初始化不会触发子类的初始化
//         System.out.println(SubClass.value);
        //TODO  继承 对于普通成员 静态成员 普通方法(3种访问权限)，静态方法, 抽象方法， 接口方法 有什么含义？？
        //       SubClass.value = 2;
//
//        /*
//         * 这里也不会输出“SubClass init”,
//         * 这里因为虽然在Java源代码中引用了SubClass类中的常量HELLOWORD,
//         * 但是在编译阶段通过常量传播优化，
//         * 已经将此常量的值“hellow word”放到了NotInitialization类的常量池中,
//         * 以后NotInitialization对常量 SubClass.HELLWORD 的引用实际都被转化为NotInitialization类对自身常量池的引用了
//         */
//        System.out.println(SubClass.HELLOWORD);

        //   System.out.println("-------------------------------------");
        //SubClass[] sca = new SubClass[10];
    }

}

class A {
    private int a;

    public A() {
        a = 2;
        System.out.println("A init");
    }

    //非静态语句块 会放到init方法最前面
    {
        a = 1;
        System.out.println("A nonstatic block");
    }

    static {
        System.out.println("A instance");
    }
}

class B extends A {
    public B() {
        System.out.println("B init");
    }

    {
        System.out.println("B nonstatic block");
    }

    static {
        System.out.println("B instance");
    }
}


class SuperClass {
    static {
        System.out.println("SuperClass init");
    }

    public static int value = 123;
}

class SubClass extends SuperClass {
    static {
        System.out.println("SubClass init");
    }

    public static final String HELLOWORD = "hellow word";
}
